转载请注明出处:http://blog.csdn.net/ns_code/article/details/15939993
基础准备
首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提到了SendQ和RecvQ缓冲队列,这两个缓冲区的容量在具体实现时会受一定的限制,虽然它们使用的实际内存大小会动态地增长和收缩,但还是需要一个硬性的限制,以防止行为异常的程序所控制的单一TCP连接将系统的内存全部消耗。正式由于缓冲区的容量有限,它们可能会被填满,事实也正是如此,如果与TCP的流量控制机制结合使用,则可能导致一种形式的死锁。
一旦RecvQ已满,TCP流控制机制就会产生作用(使用流控制机制的目的是为了保证发送者不会传输太多数据,从而超出了接收系统的处理能力),它将阻止传输发送端主机的SendQ中的任何数据,直到接收者调用输入流的read()方法将RecvQ中的数据移除一部分到Delivered中,从而腾出了空间。发送端可以持续地写出数据,直到SendQ队列被填满,如果SendQ队列已满时调用输出流的write()方法,则会阻塞等待,直到有一些字节被传输到RecvQ队列中,如果此时RecvQ队列也被填满了,所有的操作都将停止,直到接收端调用了输入流的read()方法将一些字节传输到了Delivered队列中。